<?php
/**
 * <class description>
 *
 * @author Matias Mirabelli <project@moyrax.com>
 *
 * @package Kingorm
 */
class DAOTemplate
{
	public $catalog = null;
	public $name = "";


	/**
	 * El constructor vincula a un DAO con una conexión
	 * abierta, pero por motivos de seguridad no linkeará
	 * en ningún momento el objeto PDO asociado al esquema.
	 *
	 * Quedará a criterio de la implementación la serie de
	 * funcionalidades que se proporcionarán a los DAO. Ya
	 * fueron incluídas funciones básicas en CatalogBase,
	 * para facilitar el intercambio de consultas.
	 */
	public function __construct(CatalogBase $catalog)
	{
		$this->catalog = $catalog;
	}

	/**
	 * Ejecuta una consultas a la base de datos y devuelve
	 * una serie de resultados.
	 *
	 * @param queryName   Nombre de la consulta.
	 * @param arguments   Argumentos para pasarle a la consulta.
	 * @param modelObject Tipo de objetos que devolverán la consulta.
	 */
	protected function queryForList($queryName, $arguments, $modelObject = null)
	{
		$preparedStmt = $this->catalog->prepareStatement(
			$this, $queryName, $arguments, $modelObject
		);

		$return = $this->catalog->fetch( $preparedStmt );

		return( $return );
	}

	/**
	 * Ejecuta una consultas a la base de datos
	 * y devuelve un único resultado.
	 *
	 * @param queryName   Nombre de la consulta.
	 * @param arguments   Argumentos para pasarle a la consulta.
	 * @param modelObject Tipo de objeto que devolverá la consulta.
	 */
	protected function queryForObject($queryName, $arguments, $modelObject = null)
	{
		$preparedStmt = $this->catalog->prepareStatement(
			$this, $queryName, $arguments, $modelObject
		);

		$return = $this->catalog->fetch( $preparedStmt );

		if ( is_array($return) && (count( $return ) > 0) )
		{
			$return = $return[0];
		}

		return( $return );
	}

	/**
	 * Realiza una operación de creación o actualización de
	 * registros en la base de datos.
	 *
	 * @param $queryName Nombre de la query a ejecutar.
	 * @param $arguments Parámetros que se pasarán a la consulta.
	 */
	protected function saveOrUpdate( $queryName, $arguments )
	{
		if ( is_object($arguments) )
		{
			// Si es un objeto, genera un array con sus propiedades.
			//
			$arguments = (array)$arguments;
		}

		$preparedStmt = $this->catalog->prepareStatement(
			$this, $queryName, $arguments, null
		);

		$return = $this->catalog->saveOrUpdate( $preparedStmt );

		return( $return );
	}

	/**
	 * Realiza una operación de borrado de registros
	 * en la base de datos.
	 *
	 * @param $queryName Nombre de la query a ejecutar.
	 * @param $arguments Parámetros que se pasarán a la consulta.
	 */
	protected function delete( $queryName, $arguments )
	{
		$preparedStmt = $this->catalog->prepareStatement(
			$this, $queryName, $arguments, null
		);

		$return = $this->catalog->delete( $preparedStmt );

		return( $return );
	}

	/**
	 * Crea un array con todos los parámetros especificados
	 * para ser utilizado en las llamadas a las queries.
	 *
	 * @param $params Lista de parámetros que se utilizarán.
	 */
	protected function makeParams( $params )
	{
		$args = func_get_args();

		return( $args );
	}

	/**
	 * Devuelve la sesión activa.
	 */
	protected function getSession()
	{
		return( Session::getInstance() );
	}
}
?>
